package com.github.prontera.common.tree;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;

/**
 * 树形结构构建
 */
public class EasyUiTreeNode implements Serializable {

	private static final long serialVersionUID = 1L;
	/**
	 * 节点ID
	 */
	public String id;
	/**
	 * 节点内容
	 */
	public String text;
	/**
	 * 父节点编号
	 */
	public String parentId;

	public String state = "closed";
	/**
	 * 孩子节点列表
	 */
	public List<EasyUiTreeNode> children = new ArrayList<EasyUiTreeNode>();

	/**
	 * 添加子节点
	 * 
	 * @param node
	 *            子节点
	 */
	public void addChild(EasyUiTreeNode node) {
		children.add(node);
	}

	public int childLen() {
		return children.size();
	}

	/**
	 * 说明方法描述：将list转为树tree结构
	 */
	public static List<EasyUiTreeNode> tree(List<EasyUiTreeNode> allRrecords) {
		List<EasyUiTreeNode> listParentTreeNode = new ArrayList<EasyUiTreeNode>();
		List<EasyUiTreeNode> listNotParentTreeNode = new ArrayList<EasyUiTreeNode>();
		// 第一步：遍历allRrecords保存所有数据的uuid用于判断是不是根节点
		Map<String, String> mapAllUuid = new HashMap<String, String>();
		Map<String, EasyUiTreeNode> allTreeNodeMap = new HashMap<String, EasyUiTreeNode>();
		for (EasyUiTreeNode record : allRrecords) {
			mapAllUuid.put(record.id, record.id);
			allTreeNodeMap.put(record.id, record);
		}
		// 第二步：遍历allRrecords找出所有的根节点和非根节点
		if (allRrecords != null && allRrecords.size() > 0) {
			for (EasyUiTreeNode record : allRrecords) {
				if (StringUtils.isBlank(record.parentId) || !mapAllUuid.containsKey(record.parentId)) {
					listParentTreeNode.add(record);
				} else {
					listNotParentTreeNode.add(record);
				}
			}
		}
		// 第三步： 递归获取所有子节点
		if (listParentTreeNode.size() > 0) {
			for (EasyUiTreeNode record : listParentTreeNode) {
				// 添加所有子级
				record.children.addAll(getTreeChildTreeNode(listNotParentTreeNode, record.id));
			}
		}
		return listParentTreeNode;
	}

	/**
	 * 说明方法描述：递归查询子节点
	 * 
	 * @param childList
	 *            子节点
	 * @param parentUuid
	 *            父节点id
	 * @return
	 * @time 2016年5月10日 下午3:29:35
	 * @author yangdong
	 */
	private static List<EasyUiTreeNode> getTreeChildTreeNode(List<EasyUiTreeNode> childList, String parentUuid) {
		List<EasyUiTreeNode> listParentTreeNode = new ArrayList<EasyUiTreeNode>();
		List<EasyUiTreeNode> listNotParentTreeNode = new ArrayList<EasyUiTreeNode>();
		// 遍历tmpList，找出所有的根节点和非根节点
		if (childList != null && childList.size() > 0) {
			for (EasyUiTreeNode record : childList) {
				// 对比找出父节点
				if (StringUtils.equals(record.parentId, parentUuid)) {
					listParentTreeNode.add(record);
				} else {
					listNotParentTreeNode.add(record);
				}
			}
		}
		// 查询子节点
		if (listParentTreeNode.size() > 0) {
			for (EasyUiTreeNode record : listParentTreeNode) {
				// 递归查询子节点
				record.children.addAll(getTreeChildTreeNode(listNotParentTreeNode, record.id));
			}
		}
		return listParentTreeNode;
	}

}